#ifndef __ESP8266_CONFIG_H
#define __ESP8266_CONFIG_H

/*============================= 用户需要设置的参数 =============================*/

/**
 * @分类：WiFi AP模式配置参数
 * @功能：定义ESP8266作为AP热点时的身份信息
 * @作用：用于模块创建WiFi热点时的身份验证，客户端需使用此SSID和密码连接
 */
#define USER_ESP8266_AP_SSID	"TSOPhone"	// AP模式下的WiFi名称（最长32字节）
#define USER_ESP8266_AP_PWD		"egcb8279"	// AP模式下的WiFi密码（8-64字节，ASCII字符）

/**
 * @分类：TCP客户端配置参数
 * @功能：定义ESP8266作为TCP客户端时连接的服务器信息
 * @作用：用于建立TCP连接时指定目标服务器的网络地址和端口
 * @使用说明：
 *   1. 取消注释下方两行即可启用TCP客户端功能
 *   2. IP地址格式："192.168.1.100"（IPv4地址字符串）
 *   3. 端口范围：1-65535（建议使用1024以上端口避免特权端口限制）
 */
#define USER_ESP8266_TCP_SERVER_IP		"192.168.1.100"	// TCP服务器的IP地址
#define USER_ESP8266_TCP_SERVER_PORT	8080			// TCP服务器的端口号（字符串格式）

/**
 * @补充参数建议（根据实际需求添加）
 */
// /* STA模式连接外部WiFi的参数 */
/*
#define USER_ESP8266_STA_SSID	"HomeWiFi"		// 目标WiFi的名称
#define USER_ESP8266_STA_PWD	"WiFiPassword"	// 目标WiFi的密码
*/

// /* TCP服务器模式配置 */
/*
#define USER_ESP8266_TCP_LISTEN_PORT	"80"	// 本地TCP服务器监听端口
*/

// /* 通信超时配置 */
/*
#define USER_ESP8266_CONNECT_TIMEOUT	5000	// 连接超时时间（毫秒）
#define USER_ESP8266_SEND_TIMEOUT		2000	// 数据发送超时时间（毫秒）
*/

/*============================= 一、硬件依赖层 =============================*/
/**
  * @brief 硬件平台依赖模块
  * @details 包含处理器内核、外设驱动和基础工具函数，为整个模块提供硬件支持
  * @{
  */
#include "stm32f10x.h"          // STM32F10x系列MCU外设库（提供GPIO、RCC等寄存器定义）
#include "USART3_Config.h"      // USART3串口驱动（ESP8266模块通信接口）
#include "USART1_Config.h"      // USART1串口驱动（系统调试信息输出）
#include "Delay.h"              // 延时函数库（提供ms/us级精确延时，用于指令交互等待）
/** @} */

/**
  * @brief 标准C库支持
  * @details 提供基础数据类型和通用算法支持
  * @{
  */
#include <stdbool.h>            // C99标准布尔类型定义（提供true/false关键字支持）
#include <stdio.h>              // 标准输入输出库（提供格式化字符串处理函数）
#include <string.h>             // 字符串处理库（提供字符串比较、拷贝等基础操作）
#include <stdio.h>				//标准输入输出
/** @} */

/*============================= 二、全局配置层 =============================*/
/**
  * @defgroup ESP8266_Config 模块核心参数配置
  * @brief 定义模块运行的关键参数，可根据实际硬件和应用场景调整
  * @{
  */
#define RXBUF_MAX_LEN     1024  // 串口接收缓冲区大小（字节），需根据RAM容量调整
#define ATE_CMD_TIMEOUT_MS  200 // ATE指令默认超时时间（毫秒），网络环境差时建议增大
/** @} */

/**
  * @defgroup Debug_Macros 调试与通信宏定义
  * @brief 封装常用的调试输出和通信操作，简化代码实现
  * @{
  */
#define ESP8266_Printf(format, ...) USART3_Printf(format, ##__VA_ARGS__)
                                // ESP8266指令发送宏，通过USART3发送格式化字符串
/** @} */

/*============================= 三、状态管理层 =============================*/
/**
  * @brief 网络状态标志
  * @note 使用volatile关键字确保在中断和主循环中访问的一致性
  */
//volatile u8 ucTcpClosedFlag = 0; // TCP连接状态标志（0=连接正常，1=连接已关闭）

/**
  * @defgroup Enum_Types 枚举类型定义
  * @brief 定义模块各种工作模式和状态的枚举，提高代码可读性
  * @{
  */

/**
  * @brief AT指令回显状态
  */
typedef enum{
    ATE_OFF,  // 关闭AT指令回显（不返回发送的指令内容，节省通信带宽）
    ATE_ON    // 开启AT指令回显（返回发送的指令内容，便于调试）
} ATE_Status_t;

/**
  * @brief GPIO上拉电阻状态
  */
typedef enum{
    DISABLE_PULL_UP,  // 禁用上拉电阻
    ENABLE_PULL_UP    // 启用上拉电阻
} PULL_UP_Status_t;

/**
  * @brief GPIO工作模式
  */
typedef enum {
    GPIO_INPUT,  // 输入模式
    GPIO_OUTPUT  // 输出模式
} GPIO_WORK_MODE_t;

/**
  * @brief GPIO输出电平
  */
typedef enum{
    HIGH_LEVEL,  // 高电平输出
    LOW_LEVEL    // 低电平输出
} GPIO_WRITE_t;

/**
  * @brief WiFi工作模式
  */
typedef enum{
    STA,       // 客户端模式（连接到其他WiFi热点）
    AP,        // 接入点模式（自身作为WiFi热点）
    STA_AP     // 混合模式（同时作为客户端和接入点）
} WIFI_MODE_t;

/**
  * @brief WiFi加密模式
  */
typedef enum{
    OPEN,            // 无加密
    WEP,             // WEP加密
    WPA_PSK,         // WPA-PSK加密
    WPA2_PSK,        // WPA2-PSK加密
    WPA_WPA2_PSK     // WPA/WPA2混合加密
} WIFI_AP_PSDMODE_t;

/**
  * @brief DHCP模式
  */
typedef enum{
    DHCP_DISABLE,  // 禁用DHCP
    DHCP_ENABLE    // 启用DHCP
} DHCP_MODE_t;

/**
  * @brief 自动AP模式
  */
typedef enum{
    DISABLE_AUTO_AP,  // 禁用自动AP模式
    ENBALE_AUTO_AP    // 启用自动AP模式
} AUTO_AP_MODE_t;

/**
  * @brief 智能配网模式
  */
typedef enum{
    ESP_TOUCH = 1,        // ESP-Touch配网模式
    AirKiss,              // AirKiss配网模式
    ESP_TOUCH_AirKiss     // ESP-Touch和AirKiss混合模式
} SMARTCONFIG_t;

/**
  * @brief 连接模式
  */
typedef enum{
    Singel_Connection,  // 单连接模式
    Multi_Connection    // 多连接模式
} CONNECTION_MODE_t;

/**
  * @brief 网络协议类型
  */
typedef enum{
    TCP,   // TCP协议
    UDP,   // UDP协议
    SSL    // SSL加密协议
} NET_TYPE_t;

/**
  * @brief 连接ID（多连接模式下标识不同连接）
  */
typedef enum{
    Multiple_ID_0 = 0,  // 多连接ID 0
    Multiple_ID_1 = 1,  // 多连接ID 1
    Multiple_ID_2 = 2,  // 多连接ID 2
    Multiple_ID_3 = 3,  // 多连接ID 3
    Multiple_ID_4 = 4,  // 多连接ID 4
    Single_ID_0 = 5     // 单连接ID 0
} LINK_ID_t;

/**
  * @brief 数据传输模式
  */
typedef enum{
    NORMAL_MODE,       // 普通模式（需要手动控制数据发送）
    TRANSPARENT_MODE   // 透传模式（数据自动转发，无需额外指令）
} TRANSFER_MODE_t;

/** @} */

/**
  * @defgroup Data_Structures 数据结构定义
  * @brief 定义模块运行所需的数据结构，用于管理接收数据和状态信息
  * @{
  */

/**
  * @brief USART接收帧结构
  * @details 用于管理从ESP8266模块接收的数据帧，包含缓冲区和状态信息
  */
extern struct STRUCT_USARTx_Fram {
    char Data_RX_BUF[RXBUF_MAX_LEN];  	// 数据接收缓冲区：存储从ESP8266接收到的原始数据
    union {                            // 帧状态联合体：高效管理帧状态信息
        __IO u16 InfAll;               // 整体状态（16位）：用于快速操作整个状态信息
        struct {                       // 位域结构：拆分状态为具体含义
            __IO u16 FramLength :15;   // 帧长度（低15位）：当前接收的数据长度，最大32767字节
            __IO u16 FramFinishFlag :1;// 帧完成标志（最高1位）：1表示接收完成，0表示接收中
        } InfBit;
    };
} strEsp8266_Fram_Record;  // ESP8266数据帧记录器实例（全局变量）

/** @} */

/*============================ 四、硬件控制层 ============================*/
/**
  * @defgroup Hardware_Control 硬件控制接口
  * @brief 提供模块硬件初始化和基础操作函数
  * @{
  */

/**
  * @分类：客户端模式函数声明
  * @brief 初始化ESP8266客户端模式的硬件及网络环境
  * @param baud 串口通信波特率（推荐115200，需与ESP8266模块波特率一致）
  * @note 1. 包含USART3初始化、GPIO配置等硬件操作，同时完成网络参数配置
  *       2. 会将模块配置为STA模式并连接指定WiFi，建立TCP服务器连接
  *       3. 函数包含阻塞操作（等待WiFi连接和服务器响应）
  *       4. 依赖USER_ESP8266_AP_SSID等网络参数宏定义
  * @retval 无
  */
void ESP8266_Client_Config(u32 baud);

/**
  * @分类：服务器模式函数声明
  * @brief 初始化ESP8266服务器模式的硬件及网络环境
  * @param baud 串口通信波特率（推荐115200，需与ESP8266模块波特率一致）
  * @note 1. 包含USART3初始化、GPIO配置等硬件操作，同时完成AP热点配置
  *       2. 会将模块配置为AP模式并创建WiFi热点，启动TCP服务器监听
  *       3. 函数包含阻塞操作（等待热点配置完成）
  *       4. 支持多客户端连接，依赖USER_ESP8266_AP_SSID等热点参数宏定义
  *       5. 默认启用DHCP服务，为连接的客户端自动分配IP地址
  * @retval 无
  */
void ESP8266_Server_Config(u32 baud);

/**
  * @brief 清空ESP8266接收缓冲区
  * @note 重置接收缓冲区和帧状态标志，准备接收新数据
  */
void ESP8266_ClearBuffer(void);

/**
  * @brief 等待ESP8266模块就绪
  * @param timeout_ms 最大等待时间（毫秒）
  * @return true-模块就绪，false-超时未就绪
  * @note 检查模块是否返回OK响应，确认模块正常工作
  */
bool ESP8266_WaitReady(u32 timeout_ms);

/** @} */

/*============================ 五、AT指令引擎 ============================*/
/**
  * @defgroup AT_Engine AT指令核心引擎
  * @brief 提供AT指令发送和响应处理的核心功能
  * @{
  */

/**
  * @brief 发送AT指令并等待指定响应
  * @param cmd 要发送的AT指令字符串
  * @param reply1 期望的第一个响应字符串
  * @param reply2 期望的第二个响应字符串（可选）
  * @param waittime 等待响应的超时时间（毫秒）
  * @return true-收到期望响应，false-超时或响应不匹配
  * @note 所有AT指令操作的基础函数，负责指令发送、响应接收和匹配
  */
bool ESP8266_Cmd(char *cmd, char *reply1, char *reply2, u32 waittime);

/** @} */

/*============================ 六、基础AT指令 ============================*/
/**
  * @defgroup Basic_AT_Commands 基础AT指令接口
  * @brief 提供ESP8266模块的基础AT指令封装
  * @{
  */

/**
  * @brief 发送模块复位指令（AT+RST）
  * @note 重启ESP8266模块，恢复默认状态
  */
void ESP8266_RST(void);

/**
  * @brief 发送测试指令（AT）
  * @note 检查模块与MCU之间的通信是否正常
  */
void ESP8266_AT(void);

/**
  * @brief 查询模块版本信息（AT+GMR）
  * @note 获取模块固件版本、SDK版本等信息
  */
void ESP8266_GMR(void);

/**
  * @brief 设置AT指令回显模式（AT+ATE）
  * @param ATE_Status 回显状态（ATE_ON/ATE_OFF）
  * @return true-设置成功，false-设置失败
  */
bool ESP8266_ATE(ATE_Status_t ATE_Status);

/**
  * @brief 恢复模块出厂设置（AT+RESTORE）
  * @note 将模块所有配置恢复为出厂默认值
  */
void ESP8266_Restore(void);

/** @} */

/*============================ 七、电源管理 ============================*/
/**
  * @defgroup Power_Management 电源管理接口
  * @brief 提供模块睡眠模式和电源控制相关功能
  * @{
  */

/**
  * @brief 设置模块进入深度睡眠模式（AT+GSLP）
  * @param time_in_us 睡眠时长（微秒）
  * @return true-设置成功，false-设置失败
  * @note 深度睡眠模式下模块功耗极低，适合电池供电应用
  */
bool ESP8266_Deep_Sleep(uint32_t time_in_us);

/**
  * @brief 设置模块睡眠模式（AT+SLEEP）
  * @param sleep_time 睡眠模式参数
  * @return true-设置成功，false-设置失败
  */
bool ESP8266_Set_SLEEP(u8 sleep_time);

/** @} */

/*============================ 八、UART配置 ============================*/
/**
  * @defgroup UART_Configuration UART配置接口
  * @brief 提供模块串口参数配置和查询功能
  * @{
  */

/**
  * @brief 查询当前UART配置（AT+UART_CUR?）
  * @note 获取当前生效的串口参数（掉电不保存）
  */
void ESP8266_Check_UART_CUR(void);

/**
  * @brief 设置当前UART配置（AT+UART_CUR）
  * @param baudrate 波特率
  * @param databits 数据位（5/6/7/8）
  * @param stopbits 停止位（1/2）
  * @param parity 校验位（0=无校验，1=奇校验，2=偶校验）
  * @param flow_control 流控（0=关闭，1=硬件流控）
  * @return true-设置成功，false-设置失败
  * @note 设置当前生效的串口参数，掉电后恢复默认值
  */
bool ESP8266_Set_UART_CUR(u32 baudrate, u8 databits, u8 stopbits, u8 parity, u8 flow_control);

/**
  * @brief 查询默认UART配置（AT+UART_DEF?）
  * @note 获取默认的串口参数（掉电保存）
  */
void ESP8266_Check_UART_DEF(void);

/**
  * @brief 设置默认UART配置（AT+UART_DEF）
  * @param baudrate 波特率
  * @param databits 数据位（5/6/7/8）
  * @param stopbits 停止位（1/2）
  * @param parity 校验位（0=无校验，1=奇校验，2=偶校验）
  * @param flow_control 流控（0=关闭，1=硬件流控）
  * @return true-设置成功，false-设置失败
  * @note 设置默认的串口参数，掉电后仍保持设置值
  */
bool ESP8266_Set_UART_DEF(u32 baudrate, u8 databits, u8 stopbits, u8 parity, u8 flow_control);

/**
  * @brief 查询UART配置（兼容旧版本指令）
  * @note 用于兼容旧版本固件的UART配置查询
  */
void ESP8266_Check_UART(void);

/**
  * @brief 设置UART配置（兼容旧版本指令）
  * @param baudrate 波特率
  * @param databits 数据位（5/6/7/8）
  * @param stopbits 停止位（1/2）
  * @param parity 校验位（0=无校验，1=奇校验，2=偶校验）
  * @param flow_control 流控（0=关闭，1=硬件流控）
  * @return true-设置成功，false-设置失败
  * @note 用于兼容旧版本固件的UART配置设置
  */
bool ESP8266_Set_UART(u32 baudrate, u8 databits, u8 stopbits, u8 parity, u8 flow_control);

/** @} */

/*============================ 九、系统功能 ============================*/
/**
  * @defgroup System_Functions 系统功能接口
  * @brief 提供模块系统信息查询和控制功能
  * @{
  */

/**
  * @brief 查询睡眠模式配置（AT+SLEEP?）
  * @note 获取当前的睡眠模式设置
  */
void ESP8266_Check_SLEEP(void);

/**
  * @brief 查询系统RAM信息（AT+SYSRAM?）
  * @note 获取当前RAM使用情况和总容量
  */
void ESP8266_Check_SYSRAM(void);

/**
  * @brief 查询ADC输入值（AT+SYSADC?）
  * @note 获取模块内置ADC的输入电压值
  */
void ESP8266_Check_SYSADC(void);

/** @} */

/*============================ 十、GPIO控制 ============================*/
/**
  * @defgroup GPIO_Control GPIO控制接口
  * @brief 提供模块GPIO引脚配置和操作功能
  * @{
  */

/**
  * @brief 查询GPIO配置（AT+SYSIOGETCFG）
  * @param pin 引脚编号
  * @note 获取指定GPIO引脚的当前配置
  */
void ESP8266_SYSIOGETCFG(u8 pin);

/**
  * @brief 配置GPIO模式（AT+SYSIOSETCFG）
  * @param pin 引脚编号
  * @param mode 工作模式
  * @param pull_up 上拉状态（ENABLE_PULL_UP/DISABLE_PULL_UP）
  * @note 设置指定GPIO引脚的工作模式和上拉状态
  */
void ESP8266_SYSIOSETCFG(u8 pin, u8 mode, PULL_UP_Status_t pull_up);

/**
  * @brief 设置GPIO方向（AT+SYSGPIODIR）
  * @param pin 引脚编号
  * @param dir 方向（GPIO_INPUT/GPIO_OUTPUT）
  * @note 设置指定GPIO引脚为输入或输出模式
  */
void ESP8266_SYSGPIODIR(u8 pin, GPIO_WORK_MODE_t dir);

/**
  * @brief 设置GPIO输出电平（AT+SYSGPIOWRITE）
  * @param pin 引脚编号
  * @param level 电平（HIGH_LEVEL/LOW_LEVEL）
  * @note 当GPIO为输出模式时，设置其输出电平
  */
void ESP8266_SYSGPIOWRITE(u8 pin, GPIO_WRITE_t level);

/**
  * @brief 读取GPIO输入电平（AT+SYSGPIOREAD）
  * @param pin 引脚编号
  * @note 当GPIO为输入模式时，读取其输入电平
  */
void ESP8266_SYSGPIOREAD(u8 pin);

/** @} */

/*============================ 十一、WiFi功能 ============================*/
/**
  * @defgroup WiFi_Functions WiFi功能接口
  * @brief 提供WiFi网络配置和管理功能
  * @{
  */

/**
  * @brief 查询WiFi工作模式（AT+CWMODE?）
  * @note 获取当前的WiFi工作模式（STA/AP/STA_AP）
  */
void ESP8266_Check_CWMOD(void);

/**
  * @brief 设置WiFi工作模式（AT+CWMODE）
  * @param mode 工作模式（STA/AP/STA_AP）
  * @return true-设置成功，false-设置失败
  * @note 切换WiFi工作模式，设置后需重启生效
  */
bool ESP8266_Set_CWMODE(WIFI_MODE_t mode);

/**
  * @brief 查询当前连接的AP信息（AT+CWJAP?）
  * @note 在STA模式下，获取当前连接的WiFi热点信息
  */
void ESP8266_Check_CWJAP(void);

/**
  * @brief 连接指定AP（AT+CWJAP）
  * @param ssid WiFi热点名称
  * @param pwd WiFi热点密码
  * @return true-连接成功，false-连接失败
  * @note 在STA模式下，连接到指定的WiFi热点
  */
bool ESP8266_Set_CWJAP(char *ssid, char *pwd);

/**
  * @brief 扫描周围AP列表（AT+CWLAP）
  * @note 扫描并获取周围可用的WiFi热点列表
  */
void ESP8266_Check_CWLAP(void);

/**
  * @brief 断开当前连接的AP（AT+CWQAP）
  * @note 在STA模式下，断开与当前连接的WiFi热点的连接
  */
void ESP8266_CWQAP(void);

/**
  * @brief 查询AP模式配置（AT+CWSAP?）
  * @note 在AP模式下，获取当前热点的配置信息
  */
void ESP8266_Check_CWSAP(void);

/**
  * @brief 配置AP模式参数（AT+CWSAP）
  * @param ssid 热点名称
  * @param pwd 热点密码
  * @param channel 信道（1-14）
  * @param psdmode 加密模式
  * @return true-配置成功，false-配置失败
  * @note 在AP模式下，设置热点的名称、密码、信道和加密方式
  */
bool ESP8266_Set_CWSAP(char *ssid, char *pwd, u8 channel, WIFI_AP_PSDMODE_t psdmode);

/**
  * @brief 查询连接到AP的设备列表（AT+CWLIF）
  * @note 在AP模式下，获取当前连接到热点的设备IP列表
  */
void ESP8266_CWLIF(void);

/**
  * @brief 查询DHCP配置（AT+CWDHCP?）
  * @note 获取当前DHCP服务的启用状态
  */
void ESP8266_Check_CWDHCP(void);

/**
  * @brief 设置DHCP模式（AT+CWDHCP）
  * @param mode 应用对象（STA/AP/STA_AP）
  * @param dhcp 启用状态（DHCP_ENABLE/DHCP_DISABLE）
  * @return true-设置成功，false-设置失败
  * @note 开启或关闭指定模式下的DHCP服务
  */
bool ESP8266_Set_CWDHCP(WIFI_MODE_t mode, DHCP_MODE_t dhcp);

/**
  * @brief 设置自动AP连接模式（AT+CWAUTOCONN）
  * @param ap_mode 自动连接状态（ENBALE_AUTO_AP/DISABLE_AUTO_AP）
  * @return true-设置成功，false-设置失败
  * @note 开启或关闭模块上电后自动连接上次连接的AP功能
  */
bool ESP8266_CWAUTOCONN(AUTO_AP_MODE_t ap_mode);

/** @} */

/*============================ 十二、MAC/IP配置 ============================*/
/**
  * @defgroup MAC_IP_Configuration MAC和IP配置接口
  * @brief 提供MAC地址和IP地址的配置和查询功能
  * @{
  */

/**
  * @brief 查询STA模式MAC地址（AT+CIPSTAMAC?）
  * @note 获取STA模式下的MAC地址
  */
void ESP8266_Check_CIPSTAMAC(void);

/**
  * @brief 设置STA模式MAC地址（AT+CIPSTAMAC）
  * @param mac MAC地址字符串（格式：aa:bb:cc:dd:ee:ff）
  * @return true-设置成功，false-设置失败
  * @note 修改STA模式下的MAC地址
  */
bool ESP8266_Set_CIPSTAMAC(char *mac);

/**
  * @brief 查询AP模式MAC地址（AT+CIPAPMAC?）
  * @note 获取AP模式下的MAC地址
  */
void ESP8266_Check_CIPAPMAC(void);

/**
  * @brief 设置AP模式MAC地址（AT+CIPAPMAC）
  * @param mac MAC地址字符串（格式：aa:bb:cc:dd:ee:ff）
  * @return true-设置成功，false-设置失败
  * @note 修改AP模式下的MAC地址
  */
bool ESP8266_Set_CIPAPMAC(char *mac);

/**
  * @brief 查询STA模式IP配置（AT+CIPSTA?）
  * @note 在STA模式下，获取当前的IP地址、网关和子网掩码
  */
void ESP8266_Check_CIPSTA(void);

/**
  * @brief 设置STA模式静态IP（AT+CIPSTA）
  * @param ip IP地址
  * @param gateway 网关地址
  * @param netmask 子网掩码
  * @return true-设置成功，false-设置失败
  * @note 在STA模式下，设置静态IP地址、网关和子网掩码
  */
bool ESP8266_Set_CIPSTA(char *ip, char *gateway, char *netmask);

/**
  * @brief 查询AP模式IP配置（AT+CIPAP?）
  * @note 在AP模式下，获取当前的IP地址、网关和子网掩码
  */
void ESP8266_Check_CIPAP(void);

/**
  * @brief 设置AP模式静态IP（AT+CIPAP）
  * @param ip IP地址
  * @param gateway 网关地址
  * @param netmask 子网掩码
  * @return true-设置成功，false-设置失败
  * @note 在AP模式下，设置静态IP地址、网关和子网掩码
  */
bool ESP8266_Set_CIPAP(char *ip, char *gateway, char *netmask);

/** @} */

/*============================ 十三、智能配网 ============================*/
/**
  * @defgroup Smart_Config 智能配网接口
  * @brief 提供智能配网功能，简化WiFi网络配置过程
  * @{
  */

/**
  * @brief 启动智能配网（AT+CWSTARTSMART）
  * @param type 配网类型（ESP_TOUCH/AirKiss/ESP_TOUCH_AirKiss）
  * @return true-启动成功，false-启动失败
  * @note 启动智能配网功能，允许通过手机APP配置WiFi信息
  */
bool ESP8266_CWSTARTSMART(SMARTCONFIG_t type);

/**
  * @brief 停止智能配网（AT+CWSTOPSMART）
  * @return true-停止成功，false-停止失败
  * @note 停止当前的智能配网过程
  */
bool ESP8266_CWSTOPSMART(void);

/**
  * @brief 查询主机名（AT+CWHOSTNAME?）
  * @note 获取模块的主机名
  */
void ESP8266_Check_CWHOSTNAME(void);

/**
  * @brief 设置主机名（AT+CWHOSTNAME）
  * @param hostname 主机名字符串
  * @return true-设置成功，false-设置失败
  * @note 修改模块的主机名
  */
bool ESP8266_CWHOSTNAME(char *hostname);

/** @} */

/*============================ 十四、TCP/IP功能 ============================*/
/**
  * @defgroup TCP_IP_Functions TCP/IP功能接口
  * @brief 提供TCP/UDP网络连接和数据传输功能
  * @{
  */

/**
  * @brief 获取连接状态
  * @return 状态码（0-未连接，1-已连接等）
  * @note 查询当前的网络连接状态
  */
u8 ESP8266_Get_LinkStatus(void);

/**
  * @brief 获取指定连接ID的状态
  * @return 状态码（0-未连接，1-已连接等）
  * @note 在多连接模式下，查询指定连接ID的连接状态
  */
u8 ESP8266_Get_IdLinkStatus(void);

/**
  * @brief 域名解析（AT+CIPDOMAIN）
  * @param domain_name 域名字符串（如"www.example.com"）
  * @return true-解析成功，false-解析失败
  * @note 将域名解析为对应的IP地址
  */
bool ESP8266_CIPDOMAIN(char *domain_name);

/**
  * @brief 设置连接模式（AT+CIPMUX）
  * @param connect_mode 连接模式（Singel_Connection/Multi_Connection）
  * @return true-设置成功，false-设置失败
  * @note 设置模块工作在单连接或多连接模式
  */
bool ESP8266_CIPMUX(CONNECTION_MODE_t connect_mode);

/**
  * @brief 建立网络连接（AT+CIPSTART）
  * @param type 协议类型（TCP/UDP/SSL）
  * @param remote_ip 远程服务器IP地址或域名
  * @param remote_port 远程服务器端口号
  * @param id 连接ID（在多连接模式下）
  * @return true-连接成功，false-连接失败
  * @note 与远程服务器建立TCP/UDP/SSL连接
  */
bool ESP8266_CIPSTART(NET_TYPE_t type, char *remote_ip, u16 remote_port, LINK_ID_t id);

/**
  * @brief 设置SSL缓冲区大小（AT+CIPSSLSIZE）
  * @param ssl_buffer_size SSL缓冲区大小
  * @return true-设置成功，false-设置失败
  * @note 配置SSL连接使用的缓冲区大小
  */
bool ESP8266_CIPSSLSIZE(u16 ssl_buffer_size);

/**
  * @brief 发送数据（AT+CIPSEND）
  * @param link_mode 连接模式（ENABLE/DISABLE）
  * @param str 要发送的数据字符串
  * @param str_length 数据长度
  * @param id 连接ID（在多连接模式下）
  * @return true-发送成功，false-发送失败
  * @note 向已建立的连接发送数据
  */
bool ESP8266_CIPSEND(FunctionalState link_mode, char *str, u32 str_length, LINK_ID_t id);

/**
  * @brief 关闭网络连接（AT+CIPCLOSE）
  * @param id 连接ID（在多连接模式下）
  * @return true-关闭成功，false-关闭失败
  * @note 关闭指定的网络连接
  */
bool ESP8266_CIPCLOSE(LINK_ID_t id);

/**
  * @brief 查询AP的IP地址
  * @param pAP_IP 存储IP地址的缓冲区
  * @param IP_Buf_Length 缓冲区长度
  * @note 获取模块在AP模式下的IP地址
  */
u8 ESP8266_AP_IP(char *pAP_IP, u8 IP_Buf_Length);

/**
  * @brief 停止网络连接（AT+STOP）
  * @param pTimeOver 超时时间
  * @return true-操作成功，false-操作失败
  * @note 停止当前的网络连接
  */
bool ESP8266_STOP(u16 pTimeOver);

/**
  * @brief 配置TCP服务器（AT+CIPSERVER）
  * @param mode 模式（ENABLE-启动，DISABLE-关闭）
  * @param port 服务器端口号
  * @param pTimeOver 超时时间
  * @return true-配置成功，false-配置失败
  * @note 启动或关闭模块的TCP服务器功能
  */
bool ESP8266_TCPSERVER(FunctionalState mode, char *port, u16 pTimeOver);

/**
  * @brief 查询传输模式（AT+CIPMODE?）
  * @note 获取当前的数据传输模式（普通模式/透传模式）
  */
void ESP8266_Check_CIPMODE(void);

/**
  * @brief 设置传输模式（AT+CIPMODE）
  * @param mode 传输模式（NORMAL_MODE/TRANSPARENT_MODE）
  * @return true-设置成功，false-设置失败
  * @note 切换数据传输模式（普通模式或透传模式）
  */
bool ESP8266_Set_CIPMODE(TRANSFER_MODE_t mode);

/**
  * @brief 发送Ping请求（AT+PING）
  * @param IP 目标IP地址
  * @return true-Ping成功，false-Ping失败
  * @note 向指定IP地址发送Ping请求，检查网络连通性
  */
bool ESP8266_Ping(char *IP);

/**
  * @brief 退出透传模式
  * @note 从透传模式切换回普通模式
  */
void ESP8266_ExitUnvarnishSend(void);

/**
  * @brief 接收字符串数据
  * @param enumEnUnvarnishTx 透传模式使能状态
  * @return 接收数据的字符串指针
  * @note 接收从ESP8266模块传来的字符串数据
  */
char* ESP8266_ReceiveString(FunctionalState enumEnUnvarnishTx);

/** @} */

#endif  // __ESP8266_CONFIG__
